#include "serverPool.h" 
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <CUnit/Basic.h>
#include <unistd.h>
// 辅助函数：等待指定毫秒数
void wait_ms(int ms) {
    usleep(ms * 1000);
}

void test_serverPoolInit(void) {
    serverPool_t server;
    int workerNum = 5;
    
    // 测试正常初始化
    CU_ASSERT_EQUAL(serverPoolInit(&server, workerNum), 0);
    
    // 验证线程ID数组是否正确初始化
    CU_ASSERT_EQUAL(server.tidArr.workerNum, WorkerNum);
    CU_ASSERT_PTR_NOT_NULL(server.tidArr.id);
    
    // 验证任务队列是否正确初始化
    CU_ASSERT_EQUAL(server.que.head, 0);
    CU_ASSERT_EQUAL(server.que.tail, 0);
    CU_ASSERT_EQUAL(server.que.queSize, 0);
    CU_ASSERT_PTR_NOT_NULL(server.que.queSize);
    
    // 验证退出标志
    CU_ASSERT_EQUAL(server.exitFlag, 0);
    
    // 清理资源
    free(server.tidArr.id);
    free(server.que.head);
}

void test_serverPoolStart(void) {
    serverPool_t server;
    int workerNum = 5;
    int i;
    
    // 初始化线程池
    CU_ASSERT_EQUAL(serverPoolInit(&server, workerNum), 0);
    
    // 启动线程池（假设存在此函数）
    CU_ASSERT_EQUAL(serverPoolStart(&server), 0);
    
    // 等待线程启动（需要根据实际情况调整等待时间）
    wait_ms(200);
    
    // 验证线程ID是否被正确设置
    for (i = 0; i < workerNum; i++) {
        CU_ASSERT_NOT_EQUAL(server.tidArr.tid[i], 0);
        printf("Worker thread ID %d: %lu\n", i, server.tidArr.tid[i]);
    }
    
    // 停止线程池（假设存在此函数）
    server.exitFlag = 1;
    pthread_cond_broadcast(&server.cond);
    
    // 等待线程退出
    for (i = 0; i < workerNum; i++) {
        if (server.tidArr.tid[i] != 0) {
            pthread_join(server.tidArr.tid[i], NULL);
        }
    }
    
    // 清理资源
    free(server.tidArr.tid);
    free(server.que.tasks);
}

int main() {
    CU_pSuite pSuite = NULL;

    if (CUE_SUCCESS != CU_initialize_registry())
        return CU_get_error();

    pSuite = CU_add_suite("ServerPoolSuite", NULL, NULL);
    if (NULL == pSuite) {
        CU_cleanup_registry();
        return CU_get_error();
    }

    if (NULL == CU_add_test(pSuite, "test_serverPoolInit", test_serverPoolInit)) {
        CU_cleanup_registry();
        return CU_get_error();
    }
    
    if (NULL == CU_add_test(pSuite, "test_serverPoolStart", test_serverPoolStart)) {
        CU_cleanup_registry();
        return CU_get_error();
    }

    CU_basic_set_mode(CU_BRM_VERBOSE);
    CU_basic_run_tests();
    CU_cleanup_registry();
    return CU_get_error();
}    
